// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.chat_friend.gift;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.eva.android.widget.SimpleGridView;
import com.eva.android.widget.SimpleGridView.DefaultElementDTO;
import com.eva.android.widget.SimpleGridView.DefaultListAdapter;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.WidgetUtils.ToastType;
import com.eva.android.widget.alert.AlertDialog;
import com.x52im.mall.logic.score.RechargeActivity;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.chat_friend.gift.model.Gift;
import com.x52im.rbchat.logic.chat_friend.gift.model.GiftsMeta;
import com.x52im.rbchat.logic.chat_friend.utils.MessageHelper;
import com.x52im.rbchat.utils.ActivityRequestCode;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

/**
 * 礼品工具界面：赠送.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @since 2.5
 */
public abstract class GiftsPagerForSend extends GiftsPagerForRoot
{
	private GiftsToolsUIWraper giftsToolsUIWraper = null;
	
	public GiftsPagerForSend(final Activity context, String friendUID, GiftsToolsUIWraper giftsToolsUIWraper)
	{
		super(context
				, friendUID
				, R.layout.widget_simple_viewpager
				, R.id.widget_simple_viewpager_layoutBottom
				, R.id.widget_simple_viewpager_viewPager);
		
		this.giftsToolsUIWraper = giftsToolsUIWraper;
	}
	
	// 根据传进来的每页元素数据集，生成该页的GridView对象
	@Override
	protected SimpleGridView createGridViewObj(Activity context, ArrayList<DefaultElementDTO> childListDatas)
	{
		return new SimpleGridView(context 
				, R.layout.chatting_gift_forsend_gridview, R.id.chatting_gift_forsend_gridview_id
				, R.layout.chatting_gift_forsend_gridview_item, R.id.chatting_gift_forsend_gridview_item_nameView, R.id.chatting_gift_forsend_gridview_item_imageView
				, childListDatas)
		{
			// 重写adapter创建方法，实现自定义的view展现逻辑
			protected DefaultListAdapter createListAdapter(
					Activity context, final int maingridviewitem_layout_res_id
					, final int maingridviewitem_text_view_id, final int maingridviewitem_image_view_id
					, ArrayList<DefaultElementDTO> listDatas)
			{
				DefaultListAdapter adapter = new ListAdapterImpl(context
						, maingridviewitem_layout_res_id
						, maingridviewitem_text_view_id 
						, maingridviewitem_image_view_id); 
				// 
				adapter.setListData(listDatas);
				return adapter;
			}
		};
	}
	
	/**
	 * 发送完成后要关闭操作界面哦.
	 */
	protected abstract void closeUIAfterSendIt();
	
	protected void fireAction(final Gift gift)
	{
		new AlertDialog.Builder(parentActivity)
		.setTitle(R.string.general_prompt)  
		.setMessage(MessageFormat.format(parentActivity.getString(R.string.chatting_gift_before_send_hint), gift.getPrice()))
		.setPositiveButton(R.string.general_yes, new DialogInterface.OnClickListener(){
			@Override
			public void onClick(DialogInterface dialog,int which)
			{
				RosterElementEntity localRee = MyApplication.getInstance(parentActivity).getIMClientManager().getLocalUserInfo();
				if(localRee != null)
				{
					
					// 【1目前礼品处理基本逻辑是】：在发送方发出礼品前，先提交服务端进行处理（处理礼品发送的记录和数
					// 据（包括减发送者的积分）等），只有等到处理成功才将真正的礼品消息发送给接收方。
					// 【2目前逻辑可能存的问题是】：如果发送方提交服务端处理成功（积分减了、记录也插入了db等），但因
					// 发送方、接收方、IM中转服务器等任何一个环节的UDP丢包（基于目前的QoS机制无法保证非分非送达到接收方）
					// ，都将使得接收方无法收到礼品（发送方看到的可能是消息失败），但实际上发送方却实已经发出来了。
					// 【3因逻辑问题带来的影响是】：目前的影响仅可能是接收方无法通过实时消息收到、发送方看到的可能是发送
					// 失败等，好在服务端的发送记录、积分处理等账目功能是绝对保证ok的，至少用户在重新登陆时可以查看的到（
					// 接收方不会错过的，在我的背包里是可以看到的）。目前没有更好地方法规避这个问题，先这样吧!!!!!!!!!!
					new GiftsProvider.SubmitSendGiftAsyncTask(parentActivity, localRee.getUser_uid()
							, parentFriendUID, gift.getGift_ident())
					{
						/**
						 * 成功处理后要调用的方法.
						 * 
						 * @param _currentScore Integer对象，本地用户的当前总积分数
						 */
						protected void onPostExecute_sucess(int _currentScore)
						{
							//
							WidgetUtils.showToast(parentActivity
									, MessageFormat.format(parentActivity.getString(R.string.chatting_gift_after_send_hint), gift.getGift_name())
									, ToastType.OK);
							
							// 服务端处理好礼品操作记录后就关闭操作界面（而不用等实时消息有没有成功发出，目的是为了提高用户体验）
							closeUIAfterSendIt();
							
							// 刷新当前积分
							refreshScore(_currentScore);
							// 直接发送礼品消息给好友
                            MessageHelper.sendGift$For$SendMessageAsync(parentActivity, parentFriendUID, gift.getGift_ident()
									, new Observer(){
										@Override
										public void update(Observable observable, Object data)
										{
											// 更新积分总数的ui显示（注意：此处的积分仅用于显示，因为如果礼
											// 品因UDP丢包等其实没有发送成功会会减积分的，目前先就这样了，要不然太复杂），真正的
											// 分数按服务端取到的最新积分数为准
											giftsToolsUIWraper.onScoreLoaded(GiftsProvider.getIntance().getCurrentScore() - gift.getPrice());
											
											// 表情发送成功后的处理（此处不保证sm!=null）
											faceSendOver(gift);
										}
									}
							);
						}
						
						/**
						 * 积分不足时要调用的方法.
						 * 
						 * @param _currentScore Integer对象，本地用户的当前总积分数
						 */
						protected void onPostExecute_scoreNotEnough(int _currentScore)
						{
							// 刷新当前积分
							refreshScore(_currentScore);
							
							new AlertDialog.Builder(parentActivity)
							.setTitle(R.string.general_prompt)  
							.setMessage(parentActivity.getString(R.string.chatting_gift_send_for_score_not_enough))
							.setPositiveButton(R.string.general_yes, new DialogInterface.OnClickListener(){
								@Override
								public void onClick(DialogInterface dialog,int which)
								{
									parentActivity.startActivityForResult(
											new Intent(parentActivity, RechargeActivity.class)
											, ActivityRequestCode.GIFTS_RECHARGE_CIONS_RESULT);
								}
							}) 
							.setNegativeButton(parentActivity.getString(R.string.general_no), null)
							.show(); 
						}
						
						/**
						 * 服务端返回其它错误时要调用的方法.
						 * <p>
						 * 通常在此种情况下，客户端上层应用只要给用户提示礼品发送失败就可以了.
						 * 
						 * @param _currentScore Integer对象，本地用户的当前总积分数
						 */
						protected void onPostExecute_otherError(int _currentScore)
						{
							// 刷新当前积分
							refreshScore(_currentScore);
							
							new AlertDialog.Builder(parentActivity)
							.setTitle(R.string.general_prompt)  
							.setMessage(MessageFormat.format(parentActivity.getString(
									R.string.chatting_gift_send_for_faild), gift.getGift_name()))
							.setPositiveButton(R.string.general_got_it, null)
							.show(); 
						}
						
						private void refreshScore(int _currentScore)
						{
//							if(_currentScore instanceof Integer)
							{
								int score = _currentScore;
								//** 把数据刷新到UI上
								giftsToolsUIWraper.onScoreLoaded(score);
							}
						}
					}.execute();
				}
				else
				{
					WidgetUtils.showToast(parentActivity, parentActivity.getString(
							R.string.chatting_gift_send_for_faild2), ToastType.WARN);
				}
				
//				// 载入当前积分
//				new GiftsProvider.QueryScoreAsyncTask(parentActivity
//						, new Observer(){
//					@Override
//					public void update(Observable observable, Object data)
//					{
//						int score = (Integer)data;
//						//** 把数据刷新到UI上
//						giftsToolsUIWraper.onScoreLoaded(score);
//						
//						// 积分不足
//						if(gift.getPrice() > score)
//						{
//							new com.eva.android.widgetx.AlertDialog.Builder(parentActivity)
//							.setTitle(R.string.general_prompt)  
//							.setMessage("积分余额不足，立即充值？") // TODO i18n
//							.setPositiveButton(R.string.general_yes, new DialogInterface.OnClickListener(){
//								@Override
//								public void onClick(DialogInterface dialog,int which)
//								{
//									// FOR DEBUG
//									// TODO 充值！
//									WidgetUtils.showToast(parentActivity, "充值功能尚后开放！", ToastType.INFO);
//								}
//							}) 
//							.setNegativeButton(parentActivity.getString(R.string.general_no), null)
//							.show(); 
//						}
//						else
//						{
//							ChatDataHelper.sendGift$For$SendMessageAsync(parentActivity, parentFriendUID, gift.getGift_ident()
//									, new Observer(){
//										@Override
//										public void update(Observable observable, Object data)
//										{
//											// 更新积分总数的ui显示（注意：此处的积分仅用于显示，因为如果礼
//											// 品因UDP丢包等其实没有发送成功会会减积分的，目前先就这样了，要不然太复杂），真正的
//											// 分数按服务端取到的最新积分数为准
//											giftsToolsUIWraper.onScoreLoaded(GiftsProvider.getIntance().getCurrentScore() - gift.getPrice());
//											
//											// 表情发送成功后的处理（此处不保证sm!=null）
//											faceSendOver(//sm, 
//													gift);
//										}
//									}
//							);
//						}
//					}
//				})
//				.execute();
			}
		}) 
		.setNegativeButton(parentActivity.getString(R.string.general_no), null)
		.show(); 
	}
	
	//-----------------------------------------------------------------------------------------
	private class ListAdapterImpl extends DefaultListAdapter
	{
		public ListAdapterImpl(Activity context,
				int maingridviewitem_layout_res_id,
				int maingridviewitem_text_view_id,
				int maingridviewitem_image_view_id)
		{
			super(context, maingridviewitem_layout_res_id, maingridviewitem_text_view_id,
					maingridviewitem_image_view_id);
		}
		
		@Override
		public View getView(final int position, View convertView, ViewGroup parent)
		{
			//列表item上的：
			TextView viewText = null;
			//列表item上的：
			ImageView viewImage = null;
			TextView viewPrice = null;
			
			//---------------------------------------------------------------------------------------- （1）UI初始化
			//当的item布局实例已经存在（不在存，意味着这个item刚好从不可见区移到可见区时）
			//** 根据android的列表ui实现，为了节比资源占用，假如列表有100行而可见区显示5行，那么任何时候
			//** 这个列表中只会有5个item的UI存在，其它的item都是当被转到可见区时自动把自
			//** 已的数据实时地更新列UI上，以便查看，也就是说item的UI并不是与后台数据一
			//** 一对应的，所以正如API文档里说的，convertView并不能确保它总能按你的想法保持不为null
			boolean needCreateItem = (convertView == null);
			//正在操作的列表行的数据集
			final DefaultElementDTO rowData = listData.get(position);
			final Gift extraData = (Gift)rowData.get__ident__();
			
			if (needCreateItem)
				//明细item的UI实例化
				convertView = layoutInflater.inflate(itemResId, null);
			//item里的操作组件实例
			viewText = (TextView) convertView.findViewById(maingridviewitem_text_view_id);////R.id.chatting_list_view_bottom_waves_list_item_txt);
			viewImage = (ImageView) convertView.findViewById(maingridviewitem_image_view_id);//R.id.chatting_list_view_bottom_waves_list_item_image);
			viewPrice = (TextView) convertView.findViewById(R.id.chatting_gift_forsend_gridview_item_priceView);
			
			//---------------------------------------------------------------------------------------- （2）增加事件处理器
			//各操作组件的事件监听器只需要在convertView被实例化时才需要重建（convertView需要被实例化
			//当然就意味着它上面的所有操作组件都已经重新新建了）
			//** 关于事件处理器的说明：事件处理器的增加其实可以不这么麻烦，直接每getView一次就给组件new一个处理器，
			//** 这样做的好处是简单，但显然存在资源浪费（每刷新一次view就新建监听器）。而现在的实现就跟Android的列表
			//** 实现原理一样，在切换到下一组item前，监听器永远只有一屏item的数量（刷新时只需要即时刷新对应item的数据到
			//** 它的监听器里），这样就节省了资源开销！
			if(needCreateItem)
			{
				//
			}

			//---------------------------------------------------------------------------------------- （3）
			// ********** 设置文本数据
			viewText.setText(extraData.getGift_name());
			GiftsMeta.showGiftDrawable(context, viewImage, extraData.getRes_drawable_id());
			viewPrice.setText(String.valueOf(extraData.getPrice()));
			
			return convertView;
		}
	}
}

